package com.smartwebx.ha.dal.util;

import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;

import org.apache.commons.lang3.time.DateUtils;

import com.smartwebx.ha.dal.usebean.SplitDateAndTimePointBean;

/**
 * 用于分割一个时间段内时间点，用于雨情
 * 
 * @author XX
 * 
 */
public class SplitDateAndTimePoint {

	public static void main(String[] args) throws ParseException {
		Date now = DateUtils.truncate(new Date(), Calendar.DATE);
		Date before = DateUtils.addDays(now, -10);
		Date firstDate = before;
		Date secondDate = DateUtils.addHours(before, 20);

		SplitDateAndTimePointBean pointBean = SplitDateAndTimePoint.splitDatePoint(now,
				now);
		System.out.println(pointBean);
	}

	/**
	 * 获得大于开始时间所有站码的雨晴数据<br/>
	 * 
	 * 1、如果不提供开始与结束日期，则默认以当前日期为准 <br/>
	 * 2、如果开始日期大于结束日期，则相互调换 <br/>
	 * 3、如果开始结束日期相同，则开始为设置的时间，结束为设置时间的下一天 <br/>
	 * 4、如果设置日期为系统当前日期，则判断系统时间是否大于8点 如果大于8点，则开始时间为8时、结束时间为当前小时
	 * 如果小于等于8点，则开始时间为昨日8时、结束时间为当前日期的当前小时 <br/>
	 * 5、如果结束日期为当前系统当前日期，则结束时间为当前日期的当前小时
	 * 
	 * @param startDate
	 *            开始日期
	 * @param endDate
	 *            结束日期
	 * @return 返回数组，数据依次为 数据类型（operatType）、开始时间（startTime）、结束时间（endTime）、
	 *         开始小时（startHour）、结束小时（endHour）
	 * 
	 * @throws ParseException
	 */
	public static SplitDateAndTimePointBean splitDatePoint(Date startDate, Date endDate) {
		/*
		 * 操作类型 1、时间相等且为当前时间且系统时间大于8时，需计算当日8时到系统小时的累计值，开始结束日期设置为null
		 * 2、时间相等且为当前时间且系统时间小于等于8时，需计算前日8时到当前小时的累计值，开始结束日期设置为null
		 * 3、时间相等且不等于当前时间，需计算设置日期到后日日期的值
		 * 4、时间不相等且结束日期与系统日期相等且系统时间大于8时，需计算开始日期到结束日期前一日日期的日雨量与当前日期8时到当前小时的时段累计雨量
		 * 5、时间不相等且结束日期与系统日期相等且系统时间小于等于8时，需计算开始日期到结束日期前两日日期的日雨量与当前日期的前日8时到当前小时的时段累计雨量
		 * 6、时间不相等且结束日期与系统日期不相等，需计算日期段得旬日雨量
		 * 7、补充类型5，如果处理后的开始时间大于结束时间，则开始结束统一设为null，只计算小时累计值。例如：2011-8-4 ——
		 * 2011-8-5 系统小时小于8点，则按照情况5进行处理，结果为：2011-8-4，2011-8-3，2011-8-4
		 * 08:0，2011-8-5 当前小时:00 ，如此则开始日期大于结束日期，有悖逻辑！
		 */
		String operatType = null;
		Date startTime = null, endTime = null;
		Date sstartHour = null, sendHour = null;
		Date startHour = null, endHour = null;
		Date startDate2 = null, endDate2 = null;//开始时间结束时间去除时分秒
		Date nowTime = new Date();//获取系统当前时间
		// 当前日期，不包含小时
		Date nowDate = DateUtils.truncate(nowTime, Calendar.DATE);
		//当前时间的小时
		int nowHour = ((Long) DateUtils.getFragmentInHours(nowTime,Calendar.DATE)).intValue();
		//开始时间的小时
		int snowHour = ((Long) DateUtils.getFragmentInHours(startDate,Calendar.DATE)).intValue();
		//结束时间的小时
		int enowHour = ((Long) DateUtils.getFragmentInHours(endDate,Calendar.DATE)).intValue();
		if (startDate.compareTo(endDate)==0) {
			if (snowHour == 0) {//判断今天和昨天
				if (startDate.compareTo(nowDate)==0) {//今天
					if (nowHour<=8) {
						sstartHour = DateUtils.addHours(nowDate, 1);//当天的1点
						sendHour = DateUtils.addHours(nowDate, nowHour+1);//当前时间+1小时
						operatType = "1";//类型为1
					} else {
						sstartHour = DateUtils.addHours(nowDate, 9);//当天的9点
						sendHour = DateUtils.addHours(nowDate, nowHour+1);//当前时间+1小时
						operatType = "2";//类型为2
					}
				} else {//昨天
					if (nowHour<8) {
						startHour = DateUtils.addHours(nowDate, -15);//前一天9点
						endHour = DateUtils.addHours(nowDate, nowHour+1);//当前时间+1小时
						operatType = "1";//类型为1
					} else {
						startTime = DateUtils.addHours(nowDate, -24);//前一天0点
						endTime = nowDate;//当前日期0点
						operatType = "3";//类型为3
					}
				}
			} else {
				startHour = startDate;//开始时间
				endHour = DateUtils.addHours(startDate, 1);//开始时间+1小时
				operatType = "1";//类型为1
			}
		} else {
			Date startTime2 = null, endTime2 = null;
			long milliseconds1 = startDate.getTime();  
			long milliseconds2 = endDate.getTime();  
			long diff = milliseconds2 - milliseconds1;
			int difftimes = (int)(diff / (60 * 60 * 1000));//开始日期与结束日期间隔小时数
			// 去除时分秒
			startDate2 = DateUtils.truncate(startDate, Calendar.DATE);
			endDate2 = DateUtils.truncate(endDate, Calendar.DATE);
			if (difftimes<24) {
				sstartHour = DateUtils.addHours(startDate, 1);//开始时间+1小时
				sendHour = DateUtils.addHours(endDate, 2);//结束时间+2小时
				operatType = "7";//类型为7
			} else if (difftimes == 24) {
				if (snowHour ==8) {//如果等于8时按整天算
					startTime = DateUtils.addHours(startDate2, 24);//开始时间+1天:00:00
					endTime = DateUtils.addHours(endDate2, 2);//结束时间+1天:00:00
					operatType = "3";//类型为3
				} else {//非8时
					sstartHour = DateUtils.addHours(startDate, 1);//开始时间+1小时
					sendHour = DateUtils.addHours(endDate, 2);//结束时间+2小时
					operatType = "1";//类型为1
				}
			} else {
				if(snowHour > 8){
					sstartHour = DateUtils.addHours(startDate, 1);//开始时间+1小时
					sendHour = DateUtils.addHours(startDate2, 33);//开始天+1天:09:00
					operatType = "1";//类型为1
					startTime2 = DateUtils.addDays(startDate2, 1);//得开始时间后一天:00:00
				} else if (snowHour < 8){
					sstartHour = DateUtils.addHours(startDate, 1);//开始时间+1小时
					sendHour = DateUtils.addHours(startDate2, 9);//开始时间9点
					operatType = "1";//类型为1
					startTime2 = startDate2;//得开始时间:00:00
				} else {
					startTime2 = startDate2;//得开始时间:00:00
				}

				if (enowHour > 8) {
					startHour = DateUtils.addHours(endDate2, 9);//结束时间9点
					endHour = DateUtils.addHours(endDate, 1);//结束时间+1小时
					operatType = "1";//类型为1
					endTime2 = DateUtils.addHours(endDate2, -24);//得结束时间前一天:00:00
				} else if (enowHour < 8){
					startHour = DateUtils.addHours(endDate2, -15);//结束时间前一天9点
					endHour = DateUtils.addHours(endDate, 1);//结束时间+1小时
					operatType = "1";//类型为1
					endTime2 = DateUtils.addHours(endDate2, -48);//得结束时间前两天:00:00
				} else {
					endTime2 = DateUtils.addHours(endDate2, -24);//得结束时间前一天:00:00
				}

				if (endTime2.getTime() >= startTime2.getTime()) {
					startTime = DateUtils.addDays(startTime2, -1);
					endTime = DateUtils.addDays(endTime2, -1);
					operatType = "6";//类型为6
				}
			}
		}
		return new SplitDateAndTimePointBean(operatType, startTime, endTime,startHour, endHour,sstartHour, sendHour);
	}

}
